// 引用实例
const app = getApp();
// 实时日志
const log = require("../log");
// 默认配置
let defaultConfig = {
  // 请求配置
  baseURL: app.globalData.wReqUrl, // 请求的 baseURL（域名地址）
  url: '', // 接口地址
  data: {}, // 请求的参数
  method: 'POST', // HTTP 请求方法
  header: {
    'content-type': 'application/json' // 默认值
  }, // 设置请求的 header，header 中不能设置 Referer。content-type 默认为 application/json
  timeout: 10000, // 超时时间，默认10秒，单位为毫秒
  // 其他配置
  debug: true, // 是否开启打印调试
  alert_time_duration: 1000, // 弹框显示时间
  alert_timeout: true, // 请求超时弹框
  alert_timeout_text: '网络繁忙，请稍后再试！', // 请求超时弹框提示内容
  alert_success: false, // 请求成功弹框
  alert_success_text: '', // 请求成功弹框提示内容
  alert_error: true, // 请求失败弹框
  alert_error_text: '', // 请求失败弹框提示内容
}
// 请求方法
export default function (params) {
  return new Promise((resolve, reject) => {
    (params && Object.prototype.toString.call(params) === '[object Object]') || (params = {}); // 判断参数是否是对象
    let config = {
      ...defaultConfig,
      ...params,
    };
    // 开发者服务器接口地址
    config.url = `${config.baseURL}${config.path}`;
    // 接口调用成功的回调函数
    if (Object.prototype.toString.call(config.success) != '[object Function]') {
      config.success = (res) => {
        if (res.statusCode == 200) {
          // 返回值
          let resData = res.data;
          // 调试
          if (config.debug) {
            console.log('接口:', config.path, '请求结果:', resData);
          }
          // 服务器返回的code编码，例:200-正确
          if (resData.code == 200) {
            // 实时日志
            log.info(`接口请求——接口:${config.path},参数:${JSON.stringify(config.data)},结果:${JSON.stringify(resData)}`);
            if (config.alert_success) {
              wx.showToast({
                title: `${ config.alert_success_text ? config.alert_success_text : resData.msg}`,
                icon: 'none',
                mask: true,
                duration: config.alert_time_duration,
              })
              resolve(resData);
            } else {
              resolve(resData);
            }
          } else {
            // 实时日志
            log.error(`接口请求——接口:${config.path},参数:${JSON.stringify(config.data)},结果:${JSON.stringify(resData)}`);
            if (config.alert_error) {
              wx.showToast({
                title: `${ config.alert_error_text ? config.alert_error_text : resData.msg}`,
                icon: 'none',
                mask: true,
                duration: config.alert_time_duration,
              })
              reject(resData);
            } else {
              reject(resData);
            }
          }
        } else {
          // 实时日志
          log.error(`接口请求——接口:${config.path},参数:${JSON.stringify(config.data)},结果:${JSON.stringify(err)}`);
          // 调试
          console.log('接口:', config.path, '错误:', err);
          reject(err);
        }
      };
    }
    // 接口调用失败的回调函数
    if (Object.prototype.toString.call(config.fail) != '[object Function]') {
      config.fail = (err) => {
        // 实时日志
        log.error(`接口请求——接口:${config.path},参数:${JSON.stringify(config.data)},结果:${JSON.stringify(err)}`);
        // 调试
        console.log('接口:', config.path, '错误:', err);
        if (config.alert_timeout && err.errMsg == "request:fail timeout") {
          wx.showToast({
            title: config.alert_timeout_text,
            icon: 'none',
            mask: true,
          })
        }
        reject(err);
      };
    }
    // 接口调用结束的回调函数（调用成功、失败都会执行）
    if (Object.prototype.toString.call(config.complete) != '[object Function]') {
      config.complete = (result) => {};
    }
    // 添加token
    // wx.getStorageSync('token') && (config.header.token = wx.getStorageSync('token'));
    console.log('请求配置文件：', config);
    // 调试
    if (config.debug) {
      console.log('接口:', config.path, '请求参数:', config.data);
    }
    // 发起 HTTPS 网络请求
    wx.request(config);
  });
}